在miniblog ConfigureServices方法裡可以觀察到處處都是services.AddXXX,services.AddYYY
public void ConfigureServices(IServiceCollection services)
{
services.AddXXX();
services.AddYYY();
//..等等
}
可以注意到services是一個介面物件(IServiceCollection )
這時候讀者假如是一個Java工程師會很驚訝:通常介面是不會提供如此多方法提供使用
。
接著點進去查看更是驚訝,居然是一個空介面,只繼承一些集合類別。
public interface IServiceCollection : IList<ServiceDescriptor>, ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IEnumerable{}
答案:從靜態類別Extensions擴展方法
而來。
Miniblog提供MetaWeblog的功能,當我們去查看WilderMinds.MetaWeblog原始碼。
可以發現對應ConfigureServices下的AddMetaWeblog方法,使用this
關鍵字加上IServiceCollection類別
參數
並且是屬靜態方法
、靜態類別
,達到擴充空介面IServiceCollection方法。
public static class MetaWeblogExtensions
{
public static IServiceCollection AddMetaWeblog<TImplementation>(this IServiceCollection coll) where TImplementation : class, IMetaWeblogProvider
{
//..略
}
}
可以看到AddMetaWeblog使用介面參數避免類別依賴,達到依賴反轉原則,加上where條件避免使用者使用非MetaWeblogProvider家族的類別 。
public static IApplicationBuilder UseMetaWeblog(this IApplicationBuilder builder)
{
//..略
}
Add
xxxx方法名稱開頭;Use
xxx方法名稱開頭Application startup in ASP.NET Core | Microsoft Docs
難怪說asp.net core除了簡單、高效外,具備極佳開發彈性跟解耦合。
今天先簡單到這邊,明天會接續今天的內容接著延伸介紹MetaWeblog。